トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     最適化 for文で沢山の処理をさせるよりfor文の処理を分割した方が早い訳
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
yosh-tosh
Åê¹ÆNo.41557
投稿日時: 2009-2-24 17:09
新米
居住地:
投稿: 13
使用環境:
MacOSX
Flash CS3
AS3.0
最適化 for文で沢山の処理をさせるよりfor文の処理を分割した方が早い訳
こんにちわyosh-toshです。

もしかしたら、ご存知かもしれませんが。。。
スクリプトの最適化を行なっていて、不思議な事が起こりました。

表題の通り処理速度についてです。以下にスクリプトをあげます。
※トレース結果は10回検証した結果の平均です。
※検証するときはmcというクラス名でリンケージしてください。

パターン1 (1万回ループ 1回)
var n:int=getTimer();
for(var i:int=0;i<10000;i++){
var obj:Sprite=new mc();
obj.x=(i%20)*obj.width;
obj.y=Math.floor(i/20)*obj.height;
addChild(obj); 	}
trace(getTimer()-n);

トレース結果:8662ms


パターン2 (1万回ループ 2回)

var arr:Array=new Array();
var n:int=getTimer();
for(var i:int=0;i<10000;i++){
	arr[i]=new mc();
	}

for(i=0;i<10000;i++){
	var obj:Sprite=arr[i];
	obj.x=(i%20)*obj.width;
	obj.y=Math.floor(i/20)*obj.height;
	addChild(obj);
	}
trace(getTimer()-n);

トレース結果:7575ms


パターン3 (1万回ループ 3回)

var arr:Array=new Array();
var n:int=getTimer();
for(var i:int=0;i<10000;i++){
	arr[i]=new mc();
	}
	
for(i=0;i<10000;i++){
	var obj:Sprite=arr[i];
	obj.x=(i%20)*obj.width;
	obj.y=Math.floor(i/20)*obj.height;
	}
	
for(i=0;i<10000;i++){
	addChild(arr[i]);
	}
trace(getTimer()-n);

トレース結果:7542ms


1万回ループを一回しかしていないパターン1が一番早いと思いきや
1秒以上も遅いです。

何故でしょう????

これは3Dなど沢山の演算を行なう上でスゴく重要なんじゃないかとおもうんですが。。。

分かる方がいたら教えて下さい。
961832p
Åê¹ÆNo.41568
投稿日時: 2009-2-25 19:07
常連
居住地: あきる野
投稿: 98
使用環境:
 
Pro
- Firefox, Chromium(Iron), IE

:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES (ASDT, MTASC, Eclipse, swfmill)
- The Natural Entry Point Method
- LB.Log, Zeroi

Pro,
Re: 最適化 for文で沢山の処理をさせるよりfor文の処理を分割した方が早い訳
 
自分も気になったので、投稿されましたソースコードの「new mc();」を「new Sprite();」に置き換えてFlexで試してみました。
FlexSDKのバージョンは 3.2.0.3958、FlashPlayerは 9.0.124.0、ブラウザは IE です。

10回実行したときの結果(単位:ms)

[パターン1] 最小:6087 最大:6510 平均:6193.4
[パターン2] 最小:5630 最大:5799 平均:5728
[パターン3] 最小:5503 最大:5699 平均:5589.2

確かに同じような傾向になることを確認しました。

これは思いつきの意見なので、まったく参考にならないのですが(汗)

[人]
 ↓
ソースコード(FLA・AS・MXMLファイル)
 ↓
[コンパイラ(Adobe FlashCS内、MXMLC、MTASC等)]
 ↓
バイトコード(SWFファイル)
 ↓
[仮想マシン(Adobe FlashPlayer等)]
 ↓
マシンコード
 ↓
[コンピュータ]

人によるソースコードの最適化もそうですが、コンパイラでもバイトコードを最適化しているかもしれません。

また、仮想マシンではCPU固有の命令やマルチコア等でも、それらを判別することでマシンコードが変わってくるかもしれません。
上手くいえないのですが、そのCPUにとって処理しやすい処理の流れの場合に速度が稼げるというか…。

自分も深層を知りたいです。


----------------
:961832p:
- AS3に少しだけ慣れてきた“なんちゃって”AMES使い

yosh-tosh
Åê¹ÆNo.41578
投稿日時: 2009-2-26 22:02
新米
居住地:
投稿: 13
使用環境:
MacOSX
Flash CS3
AS3.0
Re: 最適化 for文で沢山の処理をさせるよりfor文の処理を分割した方が早い訳
961832pさん
ありがとうございます。

なるほど、人の最適化はCPUにとって逆効果になるかも知れない。。。

なんとも怖い話しです。

逆にCPUの得意不得意が分かれば効果的な最適化が行なえるという事ですね。

そんなの勉強してる時間は出来ないですけど。。。

早く人の手で最適化など行なわなくてもイイ時代になればいいですね。
ウチのPCが古いだけか。。。

ちなみに環境は
Mac OSX 10.4
flash CS3
flashplayer 9.0.45
firefox 3.0
でした
961832p
Åê¹ÆNo.41581
投稿日時: 2009-2-27 5:33
常連
居住地: あきる野
投稿: 98
使用環境:
 
Pro
- Firefox, Chromium(Iron), IE

:AS3:
- Adobe Flex SDK, Eclipse, AIR GEAR
- LB.Log AS3, Alcon2

:AS2:
- AMES (ASDT, MTASC, Eclipse, swfmill)
- The Natural Entry Point Method
- LB.Log, Zeroi

Pro,
Re: 最適化 for文で沢山の処理をさせるよりfor文の処理を分割した方が早い訳
 
yosh-tosh さん、応答ありがとうございます。

引用:
なるほど、人の最適化はCPUにとって逆効果になるかも知れない。。。
なんとも怖い話しです。
逆にCPUの得意不得意が分かれば効果的な最適化が行なえるという事ですね。

あわわ…あくまで推測なので、あまり影響を受けないでくださいね(汗笑)。

その後、「new mc();」を「createEmptyMovieClip("mc"+i, depth+i);」に置き換え、AS2のコンパイラであるMTASCで試してみました。
計測してみると、パート1・2とも14500ms前後で速度に差がなかったので、もしかしたらソースコードへ施した最適化が無意味になるなんてこともあるかもしれないと感じました。

とはいえAS3ではビット演算による高速化など、伝統的な手法が有効らしいので色々試してみるのも楽しいかもしれません。
その際は実際に計測してみることが大切だと思います。
 ・ActionScript3 最適化・高速化Tips 簡易まとめ - ConquestArrow.addEventListener(); - actionscriptグループ

引用:
早く人の手で最適化など行なわなくてもイイ時代になればいいですね。

FlashやJavaなどの仮想マシンを介するタイプは、CPUなどのハードウェアを極力意識しない、誰もが簡単に高品質なものを…といった方向性だと思うので、そのうちそういう時代になるんでしょうね…少し寂しい気もしますが(苦笑)。
でも、なかにはバイトコードを直接(?)書く人もおられるようで面白いです。

引用:
ウチのPCが古いだけか。。。

先の計測では、CPUがPentium4 2.4GHz(1コア)、メモリがDDRのPCで試したのですが、CPUをCore2Quad 2.83GHz(4コア)、メモリがDDR3のPCで同じように計測してみると、パート1が約340ms、パート2と3は約330msにまで速度が変化しました。
なので、PCの性能を上げるのが一番手っ取り早いのかもしれませんが、制限がある中で生まれる「何とか○○できないかな」とプログラムを工夫しようとする精神は、とてもエキサイティングで、最適化に限らずとても大切だと自分は思います。
でも、苦しみも同じように生まれるので最終的には変わらないのかもしれませんが(苦笑)。


----------------
:961832p:
- AS3に少しだけ慣れてきた“なんちゃって”AMES使い

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops